package com.sugon.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.sugon.entity.vo.TicketLiveImageGroup;
import com.sugon.modules.device.consts.enums.DevRepairTicketStatusEnum;
import com.sugon.modules.device.model.DevRepairReplaceSparePartItemVO;
import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 维修记录单实体
 * 表名 DEV_REPAIR_RECORD
 *
 * @author YuXD
 * @date 2023-05-20
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class DevRepairRecordEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键：有可能是原工单ID或新的ID
     */
    private String id;

    /**
     * 原维修记录ID
     */
    private String originRepairRecordId;

    /**
     * 原故障类型ID，长安制造处制定代码库后废弃
     * DEV_MAINTEN_REPAIR表的type字段
     */
    private String originFaultType;

    /**
     * 报修编号
     */
    @Excel(name = "工单编号")
    private String repairCode;

    /**
     * 设备ID
     */
    private String devId;

    /**
     * 报警来源，具体取值参照：DeviceTicketSource
     */
    @Excel(name = "来源")
    private String source;

    /**
     * 故障代码：一般为发生故障时由第三方传递过来的代码
     */
    @Excel(name = "报警代码")
    private String faultCode;

    /**
     * 故障描述：一般为发生故障时由第三方传递过来的故障信息
     */
    @Excel(name = "报警描述")
    private String faultDesc;

    /**
     * 报警故障ID：是长安内部自己建立的报警代码库
     * 取值自：ALARM_CODE_BASE
     * 是根据设备ID + faultCode ,去系统查询回填而来的
     */
    private String faultId;

    /**
     * 报警/故障分类ID，一般为cccId
     */
    private String faultCategoryId;

    /**
     * 上报人ID
     */
    private String uploadId;

    /**
     * 报修人姓名
     */
    @Excel(name = "报修人")
    private String uploadName;

    /**
     * 报修时间
     */
    @Excel(name = "报修时间", importFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date uploadDate;

    /**
     * 报修描述：一般用于现场人员上报故障时，故障现场现状的描述
     * 区别于faultDesc
     */
    private String uploadDesc;

    /**
     * 解决办法
     */
    @Excel(name = "解决办法")
    private String solution;
    /**
     * 原因
     */
    @Excel(name = "原因分析")
    private String reason;
    /**
     * 故障描述
     */
    @Excel(name = "故障描述")
    private String recordDescr;

    /**
     * 维修结束时间
     */
    @Excel(name = "结束维修时间", importFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date repairEndDate;
    /**
     * 维修开始时间
     */
    @Excel(name = "开始维修时间", importFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date repairStartDate;


    /**
     * 维修人ID
     */
    private String repairUser;

    /**
     * 故障时长：生产班组长进行效果确认节点
     * 由效果确认时间 - 上报时间计算得出
     */
    private Long faultDuration;

    /**
     * 维修工单状态：取自DevRepairTicketStatus值
     */
    private Integer devStatus;

    /**
     * 维修工单状态：取自DevRepairTicketStatus值
     */
    @Excel(name = "工单状态")
    private String devStatusDesc;

    /**
     * 工单发生后是否指定预防措施： 1： 0:
     */
    private Integer isPrevented;

    /**
     * 是否是异常工单：报修后超过24小时未关闭，则为异常
     * 0:正常 1：异常
     */
    private Integer isError;

    public Integer getIsError() {
        if (this.devStatus != null && !NumberUtil.equals(DevRepairTicketStatusEnum.CLOSE.getValue(), this.devStatus)) {
            if (this.uploadDate != null && DateUtil.between(this.uploadDate, DateUtil.date(), DateUnit.HOUR) > 24) {
                return 1;
            }
        }
        return 0;
    }

    /**
     * 车间ID
     */
    private String workshopId;

    /**
     * 删除状态
     */
    private Integer delFlag;

    /**
     * 创建人
     */
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

    /**
     * 最近一次更新人员
     */
    private String updateBy;

    /**
     * 最近一次更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;

    /**
     * 附件：一般用于制定维护措施时添加附件用
     */
    private String attachment;

    /**
     * 备注信息
     */
    @Excel(name = "备注")
    private String remark;

    /**
     * 设备名称
     */
    private String devName;

    /**
     * 设备编码
     */
    @Excel(name = "设备编码")
    private String devCode;

    /**
     * 故障时间 = 维修结束时间 - 报修时间
     */
    private Integer faultTime;

    /**
     * 维修人姓名
     */
    @Excel(name = "维修人")
    private String repairUsername;

    /**
     * 车间名称
     */
    private String workshopName;
    /**
     * 工序名称
     */
    private String devProceName;
    /**
     * 工序号
     */
    private String devProceNo;

    /**
     * 设备小类编码：
     */
    private String devTypeS;

    /**
     * 产线名称
     */
    private String devProductName;

    /**
     * 产线代码
     */
    private String devProductCode;

    /**
     * 设备类型 1普通设备 2 能源设备
     */
    private String devKind;

    /**
     * 故障预防措施列表
     */
    private List<DevFaultPreventMeasure> preventMeasureList;

    /**
     * 报警现场照片：由现场人员拍摄的故障图片
     */
    private List<String> faultImages;

    /**
     * 维修过程中更换的备件列表
     */
    private List<DevRepairReplaceSparePartItemVO> replaceSpareList;

    /**
     * D
     * 现场图片列表按照groupName后的分组
     */
    private List<TicketLiveImageGroup> ticketLiveImageGroup;

    public List<DevRepairReplaceSparePartItemVO> getReplaceSpareList() {
        if (replaceSpareList == null) {
            replaceSpareList = new ArrayList<>();
        }
        return replaceSpareList;
    }

    /***************VO字段***************/
    /**
     * VRT ID
     */
    private String vrtId;

    /**
     * VRT名称
     */
    private String vrtName;

    /**
     * VFG ID
     */
    private String vfgId;

    /**
     * 报警分类名称
     */
    private String faultCategoryName;

    /**
     * 车间、产线或者工序名称  OR 车间、产线或者工序代码
     */
    private String devOrgKeywords;

    /**
     * 时长，优先为故障时长，其次为维修时长
     */
    private Integer duration;

}
